package utils

import (
	"fmt"
	"image"
	"image/jpeg"
	"image/png"
	"os"

	"golang.org/x/image/bmp"
	"golang.org/x/image/webp"
)

// png webp bmp jpg/jpeg

func PngToJpeg(inputPath, outputPath string) error {
	var quality uint = 0
	// 打开PNG文件
	pngFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer pngFile.Close()

	// 解码PNG图片
	pngImage, err := png.Decode(pngFile)
	if err != nil {
		return err
	}

	// 创建JPG文件
	jpgFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer jpgFile.Close()

	// 如果未提供JPEG选项，使用默认质量(75)
	var jpegOptions *jpeg.Options
	if quality == 0 {
		jpegOptions = &jpeg.Options{Quality: 75}
	} else {
		jpegOptions = &jpeg.Options{Quality: int(quality)}
	}

	// 编码为JPG格式并保存
	err = jpeg.Encode(jpgFile, pngImage, jpegOptions)
	if err != nil {
		return err
	}

	return nil
}

func WebpToJpeg(inputPath, outputPath string) error {
	var quality uint = 0
	// 打开Webp文件
	webpFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer webpFile.Close()

	// 解码WEBP图片
	webpImage, err := webp.Decode(webpFile)
	if err != nil {
		return fmt.Errorf("WEBP解码失败: %v", err)
	}

	// 创建JPG文件
	jpgFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer jpgFile.Close()

	// 如果未提供JPEG选项，使用默认质量(75)
	var jpegOptions *jpeg.Options
	if quality == 0 {
		jpegOptions = &jpeg.Options{Quality: 75}
	} else {
		jpegOptions = &jpeg.Options{Quality: int(quality)}
	}

	// 编码为JPG格式并保存
	err = jpeg.Encode(jpgFile, webpImage, jpegOptions)
	if err != nil {
		return err
	}
	return nil
}

// func GifToJpeg(inputPath, outputPath string, quality uint) error {
// 	// 打开GIF文件
// 	gifFile, err := os.Open(inputPath)
// 	if err != nil {
// 		return fmt.Errorf("无法打开GIF文件: %v", err)
// 	}
// 	defer gifFile.Close()
// 	// 解码GIF
// 	gifImage, err := gif.DecodeAll(gifFile)
// 	if err != nil {
// 		return fmt.Errorf("GIF解码失败: %v", err)
// 	}
// 	if len(gifImage.Image) == 0 {
// 		return fmt.Errorf("GIF文件没有帧")
// 	}
// 	// 获取第一帧
// 	firstFrame := gifImage.Image[0]
// 	// 创建JPG文件
// 	jpgFile, err := os.Create(outputPath)
// 	if err != nil {
// 		return fmt.Errorf("无法创建JPG文件: %v", err)
// 	}
// 	defer jpgFile.Close()
// 	// 如果未提供JPEG选项，使用默认质量(75)
// 	var jpegOptions *jpeg.Options
// 	if quality == 0 {
// 		jpegOptions = &jpeg.Options{Quality: 75}
// 	} else {
// 		jpegOptions = &jpeg.Options{Quality: int(quality)}
// 	}
// 	// 编码为JPG格式并保存
// 	err = jpeg.Encode(jpgFile, firstFrame, jpegOptions)
// 	if err != nil {
// 		return err
// 	}
// 	return nil
// }

func BmpToJpeg(inputPath, outputPath string) error {
	var quality uint = 0
	// 打开BMP文件
	bmpFile, err := os.Open(inputPath)
	if err != nil {
		return fmt.Errorf("无法打开BMP文件: %v", err)
	}
	defer bmpFile.Close()

	// 解码BMP图片
	// Go标准库的image.Decode会自动检测格式并解码BMP
	bmpImage, format, err := image.Decode(bmpFile)
	if err != nil {
		return fmt.Errorf("图片解码失败: %v", err)
	}
	// 检查格式是否为BMP
	if format != "bmp" {
		return fmt.Errorf("输入文件不是BMP格式: %s", format)
	}

	// 创建JPG文件
	jpgFile, err := os.Create(outputPath)
	if err != nil {
		return fmt.Errorf("无法创建JPG文件: %v", err)
	}
	defer jpgFile.Close()

	// 如果未提供JPEG选项，使用默认质量(75)
	var jpegOptions *jpeg.Options
	if quality == 0 {
		jpegOptions = &jpeg.Options{Quality: 75}
	} else {
		jpegOptions = &jpeg.Options{Quality: int(quality)}
	}

	// 编码为JPG格式并保存
	err = jpeg.Encode(jpgFile, bmpImage, jpegOptions)
	if err != nil {
		return err
	}
	return nil
}

func JpegToPng(inputPath, outputPath string) error {
	// 打开文件
	jpgFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer jpgFile.Close()

	jpgImage, err := jpeg.Decode(jpgFile)
	if err != nil {
		return err
	}

	// 创建PNG文件
	pngFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer pngFile.Close()

	err = png.Encode(pngFile, jpgImage)
	if err != nil {
		return err
	}
	return nil
}

func BmpToPng(inputPath, outputPath string) error {
	// 打开BMP文件
	bmpFile, err := os.Open(inputPath)
	if err != nil {
		return fmt.Errorf("无法打开BMP文件: %v", err)
	}
	defer bmpFile.Close()

	// 解码BMP图片
	// Go标准库的image.Decode会自动检测格式并解码BMP
	bmpImage, format, err := image.Decode(bmpFile)
	if err != nil {
		return fmt.Errorf("图片解码失败: %v", err)
	}
	// 检查格式是否为BMP
	if format != "bmp" {
		return fmt.Errorf("输入文件不是BMP格式: %s", format)
	}

	// 创建PNG文件
	pngFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer pngFile.Close()

	err = png.Encode(pngFile, bmpImage)
	if err != nil {
		return err
	}
	return nil
}

func WebpToPng(inputPath, outputPath string) error {
	// 打开Webp文件
	webpFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer webpFile.Close()

	// 解码WEBP图片
	webpImage, err := webp.Decode(webpFile)
	if err != nil {
		return fmt.Errorf("WEBP解码失败: %v", err)
	}

	// 创建JPG文件
	jpgFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer jpgFile.Close()

	// 创建PNG文件
	pngFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer pngFile.Close()

	err = png.Encode(pngFile, webpImage)
	if err != nil {
		return err
	}
	return nil
}

func JpegToBmp(inputPath, outputPath string) error {
	// 打开文件
	jpgFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer jpgFile.Close()

	jpgImage, err := jpeg.Decode(jpgFile)
	if err != nil {
		return err
	}

	webpFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer webpFile.Close()

	err = bmp.Encode(webpFile, jpgImage)
	if err != nil {
		return err
	}
	return nil
}

func PngToBmp(inputPath, outputPath string) error {
	// 打开PNG文件
	pngFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer pngFile.Close()

	// 解码PNG图片
	pngImage, err := png.Decode(pngFile)
	if err != nil {
		return err
	}

	bmpFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer bmpFile.Close()

	err = bmp.Encode(bmpFile, pngImage)
	if err != nil {
		return err
	}
	return nil
}

func WebpToBmp(inputPath, outputPath string) error {
	// 打开Webp文件
	webpFile, err := os.Open(inputPath)
	if err != nil {
		return err
	}
	defer webpFile.Close()

	// 解码WEBP图片
	webpImage, err := webp.Decode(webpFile)
	if err != nil {
		return fmt.Errorf("WEBP解码失败: %v", err)
	}

	bmpFile, err := os.Create(outputPath)
	if err != nil {
		return err
	}
	defer bmpFile.Close()

	err = bmp.Encode(bmpFile, webpImage)
	if err != nil {
		return err
	}
	return nil
}
